package com.test.ssm.controller;

import org.springframework.stereotype.Component;

import javax.websocket.*;
import javax.websocket.server.PathParam;
import javax.websocket.server.ServerEndpoint;
import java.io.IOException;
import java.util.Map;
import java.util.concurrent.ConcurrentHashMap;

/**
 * @author 徒有琴
 */
@ServerEndpoint("/echo/{name}")
@Component
public class EchoSocket {

    private static Map<String, Session> allClients = new ConcurrentHashMap();//用于记录所有的用户和连接之间的关系
    /**
     * 当打开连接的时候,代表有人连接我们了
     *
     * @param name    此处的 name 代表类注解上面的访问路径后的name,
     *                我们此处做测试,根据用户传过来的名字做区分, 也可以通过 ip 等区分
     * @param session 当前连接的 session
     * @throws Exception
     */
    @OnOpen//此注解的作用是声明当前方法是当建立连接的时候调用
    public void onOpen(@PathParam("name") String name, Session session) throws Exception {
        allClients.put(name, session);//将当前连接放入到 map中
    }

    @OnMessage//此注解的作用是当收到消息的时候执行
    public void onMessage(Session session, String message) {
        System.out.println("收到消息：" + message);
        session.getAsyncRemote().sendText("我收到了，你发的是：" + message);
    }

    @OnClose//此注解的作用是 当连接关闭的时候执行
    public void onClose(Session session) {
        System.out.println(session + "关闭连接");
    }

    @OnError//此注解的作用是当出现异常的时候执行
    public void onError(Session session, Throwable e) {
        try {
            e.printStackTrace();
            session.close();
        } catch (IOException e1) {
            e1.printStackTrace();
        }
    }
    public static void  sendMessage(String name, String message) {
        Session toSession = allClients.get(name);//找到目标所在对应的 session
        if (toSession != null) {
            toSession.getAsyncRemote().sendText(message);// 发送消息
        }
    }
}
